#ifndef xpack_meta_prop_type
#define xpack_meta_prop_type
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::meta_prop_type::inc
#include"define/base_type.hpp"
#include"macro/xexport.hpp"
#include"meta/is_xstruct_prop.hpp"
#include"meta/remove_ref.hpp"
#pragma pop_macro("xuser")

namespace mixc::meta_prop_type{
    template<class may_prop_t, ignore_propcast_t>
    struct meta{
        using result = may_prop_t;
    };

    template<inc::is_xstruct_prop type_t>
    struct meta<type_t, with_propcast>{
        static decltype(auto) invoke(){
            inc::remove_ref<type_t> * ptr = nullptr;
            return (*ptr)();
        }

        using result = decltype(invoke());
    };

    template<class type_t, ignore_propcast_t ignore_propcast_v = with_propcast>
    using prop_type = typename meta<type_t, ignore_propcast_v>::result;
}

#endif

xexport(mixc::meta_prop_type::prop_type)